﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.Linq;

namespace TMS
{
    public class DeveloperXMLManager : XMLBaseManager
    {
        #region SINGLETON

        private static DeveloperXMLManager _instancia;

        public static DeveloperXMLManager getInstancia()
        {
            if (_instancia == null)
            {
                _instancia = new DeveloperXMLManager();
            }
            return _instancia;
        }
        #endregion

        #region CONSTRUCTORES
        private DeveloperXMLManager()
        {
            nombreRoot = "Developers";
            nombreArchivo = nombreRoot + ".xml";
        }

        #endregion

        #region METODOS

        public void addDeveloper(Developer pDeveloper)
        {
            long idDeveloper;
            Usuario us = UsuarioXMLManager.getInstancia().getUsuarioById(pDeveloper.NroUsuario);
            if (us == null)
            {
                idDeveloper = UsuarioXMLManager.getInstancia().addUsuario((Usuario)pDeveloper);
            }
            else
            {
                idDeveloper = us.NroUsuario;
            }
            XDocument xDoc = loadDoc(); //Carga el documento.
            XElement developers = xDoc.Root; //Obtiene la raiz del documento XML.
            XElement developer = new XElement("Developer"); //Genera un nuevo elemento.
            developer.SetAttributeValue("IdUsuario", "" + idDeveloper);
            developers.Add(developer);
            saveDoc(xDoc);

        }
        public void updateDeveloper(Developer pDeveloper)
        {
            UsuarioXMLManager.getInstancia().updateUsuario((Usuario)pDeveloper);
            XDocument xDoc = loadDoc(); //Carga el documento.
            XElement developers = xDoc.Root; //Obtiene la raiz del documento XML.
            XElement xEl = null;
            try
            {
                xEl = developers.Elements().Single(d => (long)d.Attribute("IdUsuario") == pDeveloper.NroUsuario);
            }
            catch (InvalidOperationException)
            {
                //Si el developer no esta registrado...
                if (xEl == null)
                {
                    //Se crea uno nuevo registro.
                    XElement developer = new XElement("Developer"); //Genera un nuevo elemento.
                    developer.SetAttributeValue("IdUsuario", "" + pDeveloper.NroUsuario);
                    developers.Add(developer);
                    saveDoc(xDoc);
                }
            }
        }
        public void removeByIdUsuario(long pId) 
        {
            /*
             * Elimina el elemento del documento XML Developer, pero no del documento Usuarios.
             */
            XDocument xDoc = loadDoc();
            XElement elemento = xDoc.Root.Elements().Single(a => (long)a.Attribute("IdUsuario") == pId);
            elemento.Remove();
            saveDoc(xDoc);
            /*Elimina al usuario al que se relaciona del documento Usuarios.xml*/
            /*UsuarioXMLManager.getInstancia().removeById(pId);*/
        }
        public bool existsById(long pId)
        {
            bool existe = false;
            XDocument xDoc = loadDoc();
            try
            {
                XElement elementos = xDoc.Root.Elements().Single(a => (long)a.Attribute("IdUsuario") == pId);
                if (elementos != null)
                {
                    existe = true;
                }
            }
            catch (InvalidOperationException)
            {
            }
            return existe;
        }
        public Developer getDeveloperById(long pDevId)
        { 
            /*
             * Devuelve una instancia de Developer correspondiente al Id suministrado.
             */
            Developer dev = new Developer();
            Usuario u = UsuarioXMLManager.getInstancia().getUsuarioById(pDevId);
            if (u != null)
            {
                dev.NroUsuario = u.NroUsuario;
                dev.Nombre = u.Nombre;
                dev.Nick = u.Nick;
                dev.Password = u.Password;
                dev.Mail = u.Mail;
                dev.Estado = u.Estado;
            }
            return dev;
        }
        public List<Developer> getDevList()
        {
            /*
             * Devuelve una lista con todos los desarrolladores disponibles en el sistema.
             */
            List<Developer> lstActivos = new List<Developer>();
            /*
             * Realiza iteraciones dentro de la lista de usuarios activos en el sistema,
             * luego agrega a una lista de tipo Developer los que pertenecen a dicho tipo 
             * de usuario y la devuelve al final.
             */ 
            foreach (Usuario u in UsuarioXMLManager.getInstancia().getListActivos())
            {
                if (UsuarioXMLManager.getInstancia().getTipoUsuario(u.NroUsuario) == "" + tipoUsuario.Developer)
                {
                    Developer dev = new Developer();
                    dev.NroUsuario = u.NroUsuario;
                    dev.Nombre = u.Nombre;
                    dev.Nick = u.Nick;
                    dev.Password = u.Password;
                    dev.Mail = u.Mail;
                    dev.Estado = usuarioEstado.Activo;
                    lstActivos.Add(dev);
                }
            }
            return lstActivos;
        }
        #endregion
    }
}